import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { ValidationPipe } from '@nestjs/common'
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { jwtConstants }  from './config'
import * as expressJWT from 'express-jwt'
async function bootstrap() {
  const app = await NestFactory.create(AppModule, {
    logger: ['log','debug','verbose','error', 'warn'],
  });
  // 全局挂载管道
  app.useGlobalPipes(new ValidationPipe());
  app.setGlobalPrefix('api') // 设置全局路由前缀
  app.enableCors();
  // 定义解析token中间件
  app.use(expressJWT({
    secret: jwtConstants.secret,
    expiresIn: jwtConstants.expiresIn,
    algorithms: ['HS256'],
  }).unless({
    // 忽略以users/api-serve开头的接口
    path: [/^\/api\/login/],
  }))

  // 定义身份认证失败中间件
app.use((err, req, res, next) => {
  console.log(err.name);
  
  // 身份认证失败后的错误  
  if (err.name === 'UnauthorizedError') return res.send({status:'500',data:[],message:'身份认证失败'})
  // 未知的错误
  if (err) return res.send({status:'501',data:[],message:'服务端错误'})
})
  const config = new DocumentBuilder()
  .setTitle('后台接口文档22')  // 标题
  .setDescription('学习级别') // 描述
  .setVersion('1.0') // 版本号 
  .addTag('API文档') // 标签
  .build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('/api/login/api-serve', app, document); // 接口文档访问路径

  await app.listen(8089);
}
bootstrap();
